package interview;


/**
 * 自动装箱和自动拆箱的实现原理
 * Integer integer = 1;
 * //自动装箱，相当于Integer integer = Integer.valueOf(1);
 * int i = integer;
 * //自动拆箱,相当于int i = integer.intValue();
 */
public class Wrapper {

    public static void main(String[] args) {
        testInteger();
        testInteger2();
    }

    public static void testInteger() {
        Integer i = 10;
        int i1 = 10;
        System.out.println(i == i1); //true

        Integer i2 = 300;
        int i3 = 300;
        System.out.println(i2 == i3); //true
    }


    public static void testInteger2() {
        System.out.println("Integer与Integer比较");

        Integer i6 = 128;
        Integer i7 = 128;
        System.out.println(i6 == i7);//false
        // i6自动装箱产生的Integer对象，大小超过了-128——127的范围，这里会直接创建该对象：new Integer(128)
        // i7同理。它们在堆中的地址是不同的，因此false.

        Integer i4 = 1;
        Integer i5 = 1;
        System.out.println(i4 == i5); //true
        // i4、i5都是从IntegerCache中取出来的对象，故true;

        Integer i8 = 127;
        Integer i9 = 127;
        System.out.println(i8 == i9);//true
        // i8、i9都是从IntegerCache中取出来的对象，故true;

        Integer i10 = new Integer(127);
        Integer i11 = 127;
        System.out.println(i10 == i11); //false
        // i10是创建的一个Integer的对象，取值是127
        // i11是进行自动装箱后生成的Integer对象，在-128——127之间，是直接从缓存IntegerCache中取出来的对象
        // i10是自己new出来的对象，i11是从IntegerCache中取的对象，地址不同，故false.

        Integer i12 = new Integer(128);
        Integer i13 = 128;
        System.out.println(i12 == i13);//false
        // 说明：i12是创建的一个Integer的对象，取值是128
        // i13 是进行自动装箱的实例，这里超出了-128——127的范围，创建了新的Integer对象。
        // 二者存储在堆中，分配的地址不同，因此用==判断时，由于对象的地址不同，所以false.
    }

}
